﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

using SistemaCenterQuimPost.Reportes; //usado para imprimir el Crystal Report en Blanco

using SistemaCenterQuimPost.Control; //Necesario para verificar fecha del SO

using SistemaCenterQuimPost.UI.PostAdministrador; //Referencia a las carpetas de las UIs
using SistemaCenterQuimPost.UI.PostCajero;
using SistemaCenterQuimPost.UI.PostSupervisor;

namespace SistemaCenterQuimPost.UI
{
    public partial class frmAutenticarPost : Form
    {
        //-------ATRIBUTOS

        private DataSet2 ds;  //variable para acceder a la base de datos.
        private DataSet2TableAdapters.UsuariosTableAdapter usariosDa;

        protected  string fechaActual;  //atributo que almacena la fecha del sistema.

       
        
        //------CONSTRUCTORES
        
        public frmAutenticarPost(string unaFecha) //se recibe como parámetro la fecha del sistema CenterQuim
        {
            InitializeComponent();

            this.ds = new DataSet2();
            this.usariosDa = new DataSet2TableAdapters.UsuariosTableAdapter();

            this.fechaActual = unaFecha;

            Thread unHilo = new Thread(new ThreadStart(imprimir));
            unHilo.Start();

        }

        public frmAutenticarPost() //contructor añadido para que pueda heredar de este el frmAutenticarCentral
        {
            InitializeComponent();
        }


        
        //-------METODOS VARIOS

        private void frmAutenticarPost_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;  //necesario para trabajar con hilos.
            this.txtUsuario.Focus(); //al comenzar se deja el foco en txtUsuario

           
        }

        private void btnIngresar_Click(object sender, EventArgs e) //Crea y muestra el frmMenu correspondiente. Cierra el actual.
        {
            
            procesarIngreso();

        }

        //se hace protected virtual, para que se pueda redefinir en frmAutenticarCentral
        protected virtual void procesarIngreso()  //lo encapsule en un método ya que así puedo usar para capturar las teclas enter sobre textBox.
        {
            usariosDa.FillByNombreyContraseña(ds.Usuarios, txtUsuario.Text.Trim().ToUpper(), txtContraseña.Text.Trim().ToUpper());  //busca el usuario en la base de datos.

            if (ds.Usuarios.Rows.Count > 0) //es decir si se encontró un nombre de usuario que coincida con txtUsuario.
            {


                if (ds.Usuarios[0].tipoUsuario == "A")  //Esto se hizo con hilo para solucionar el problema que se cierra la aplicación al cerrar frmAutenticarPost
                {
                    Thread NuevoHilo = new System.Threading.Thread(new System.Threading.ThreadStart(ejecutarModoAdministrador));
                    NuevoHilo.SetApartmentState(System.Threading.ApartmentState.STA);
                    NuevoHilo.Start();

                }
                else if (ds.Usuarios[0].tipoUsuario == "C") //Esto se hizo con hilo para solucionar el problema que se cierra la aplicación al cerrar frmAutenticarPost
                {

                    Thread NuevoHilo = new System.Threading.Thread(new System.Threading.ThreadStart(ejecutarModoCajero));
                    NuevoHilo.SetApartmentState(System.Threading.ApartmentState.STA);
                    NuevoHilo.Start();


                }
                else if (ds.Usuarios[0].tipoUsuario == "S") //Esto se hizo con hilo para solucionar el problema que se cierra la aplicación al cerrar frmAutenticarPost
                {
                    Thread NuevoHilo = new System.Threading.Thread(new System.Threading.ThreadStart(ejecutarModoSupervisor));
                    NuevoHilo.SetApartmentState(System.Threading.ApartmentState.STA);
                    NuevoHilo.Start();

                }

                this.Close();  //cerrar el formulario de autenticación
            }
            else
            {
                errorProvider1.SetError(txtUsuario, "El usuario y/o contraseña no son válidos.");
            }
        }



        protected virtual void ejecutarModoSupervisor()  //ejecuta en un hilo la aplicación a traves de frmMenuSupervisor.
        {
            frmMenuSupervisor unFrmMenuSupervisor = new frmMenuSupervisor();
            unFrmMenuSupervisor.setNombreUsuario(ds.Usuarios[0].nombreUsuario); //establece el usuario
            unFrmMenuSupervisor.setCodigoUsuario(ds.Usuarios[0].codUsuario); //establece el codUsuario
            unFrmMenuSupervisor.setFechaActual(this.fechaActual); //establece fechaActual
            unFrmMenuSupervisor.setTxtMenu();
            unFrmMenuSupervisor.ShowDialog();
        }

        //protected virtual, para que se pueda redefinir en frmAutenticarCentral
        protected virtual void ejecutarModoAdministrador() //ejecuta en un hilo la aplicación a traves de frmMenuAdministrador.
        {
            frmMenuAdministrador unFrmMenuAdministrador = new frmMenuAdministrador();
            unFrmMenuAdministrador.setNombreUsuario(ds.Usuarios[0].nombreUsuario); //establece el usuario
            unFrmMenuAdministrador.setCodigoUsuario(ds.Usuarios[0].codUsuario); //establece el codUsuario
            unFrmMenuAdministrador.setFechaActual(this.fechaActual); //establece fechaActual
            unFrmMenuAdministrador.setTxtMenu();
            unFrmMenuAdministrador.ShowDialog();  //muestra el formulario
        }

        private void ejecutarModoCajero() //ejecuta en un hilo la aplicación a traves de frmMenuCajero
        {
            frmMenuCajero unFrmMenuCajero = new frmMenuCajero();
            unFrmMenuCajero.setNombreUsuario(ds.Usuarios[0].nombreUsuario); //establece el usuario
            unFrmMenuCajero.setCodigoUsuario(ds.Usuarios[0].codUsuario); //establece el codUsuario
            unFrmMenuCajero.setFechaActual(this.fechaActual); //establece fechaActual
            unFrmMenuCajero.setTxtMenu();
            unFrmMenuCajero.ShowDialog();
        }


        private void presionTeclaF1(object sender, KeyEventArgs e)  //captura evento KeyDown. 
        {
            if (e.KeyCode == Keys.F1)
            {

                bool tieneError = false;

                foreach (System.Windows.Forms.Control ctrl in this.Controls)
                {
                    if (errorProvider1.GetError(ctrl) != "")
                    {
                        tieneError = true;
                    }
                }

                if (tieneError) mostrarErrores();
            }

        }

        protected void mostrarErrores()
        {
            //En caso de que el formulario no sea válido se avisa de que el mismo contiene errores. Usando StringBuilder.

            StringBuilder mensaje = new StringBuilder();

            foreach (System.Windows.Forms.Control ctrl in this.Controls)
            {
                if (errorProvider1.GetError(ctrl) != "")
                {
                    mensaje.Append(errorProvider1.GetError(ctrl) + "\n");
                }
            }

            MessageBox.Show(mensaje.ToString(), "INFORME DE ERRORES", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }


        private void presionoEnter(object sender, KeyEventArgs e) //captura el evento ENTER
        {
            if (e.KeyCode == Keys.Enter)
            {
                this.procesarIngreso();
            }
        }

        private void imprimir()
        {
            crBlanco unCr = new crBlanco();
            frmReporteBlanco unRepBlanco = new frmReporteBlanco();
            unRepBlanco.crvBlanco.ReportSource = unCr;
            unRepBlanco.Show();
            unRepBlanco.Close();
        }

    }
}
